/**
 * @项目名称: lession01
 * @文件名称: Datatype_Key.java
 * @Date: 2016年9月21日
 * @Copyright: 2016 www.yunhe.cn Inc. All rights reserved.
 * 注意：本内容仅限于云和数据公司内部传阅，禁止外泄以及用于其他的商业目的
*/
package com.thinkgem.redis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.junit.Test;

import redis.clients.jedis.Jedis;

/**
 * 
 * JEDIS常用的对List类型的操作方法
 * 
 * @author ZSL
 *
 */
public class Datatype_List {

	/**
	 * 日志工具
	 */
	Logger logger = Logger.getLogger(Datatype_List.class);
	
	/**
	 * 测试操作
	 * 
	 * 以下是多数相对常用的KEY操作
	 * 
	 * 其他未涉及到的自己可以扩展查询命令练习下
	 * 
	 * 工作生产环境中根据具体业务，需要用到了再去查资料调用某个命令方法即可。
	 * 
	 */
	@Test
	public void operator(){
		
		Jedis client = new Jedis("127.0.0.1",6379);
		client.auth("123456");
		
		client.flushDB();
		logger.debug("===========添加一个list===========");
		client.lpush("collections", "ArrayList", "Vector", "Stack", "HashMap", "WeakHashMap", "LinkedHashMap");
		client.lpush("collections", "HashSet");
		client.lpush("collections", "TreeSet");
		client.lpush("collections", "TreeMap");
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));//-1代表倒数第一个元素，-2代表倒数第二个元素
		logger.debug("collections区间0-3的元素："+client.lrange("collections",0,3));
		logger.debug("===============================");
		// 删除列表指定的值 ，第二个参数为删除的个数（有重复时），后add进去的值先被删，类似于出栈
		logger.debug("删除指定元素个数："+client.lrem("collections", 2, "HashMap"));
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));
		logger.debug("删除下标0-3区间之外的元素："+client.ltrim("collections", 0, 3));
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));
		logger.debug("collections列表出栈（左端）："+client.lpop("collections"));
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));
		logger.debug("collections添加元素，从列表右端，与lpush相对应："+client.rpush("collections", "EnumMap"));
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));
		logger.debug("collections列表出栈（右端）："+client.rpop("collections"));
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));
		logger.debug("修改collections指定下标1的内容："+client.lset("collections", 1, "LinkedArrayList"));
		logger.debug("collections的内容："+client.lrange("collections", 0, -1));
		logger.debug("===============================");
		logger.debug("collections的长度："+client.llen("collections"));
		logger.debug("获取collections下标为2的元素："+client.lindex("collections", 2));
		logger.debug("===============================");
		client.lpush("sortedList", "3","6","2","0","7","4");
		logger.debug("sortedList排序前："+client.lrange("sortedList", 0, -1));
		logger.debug(client.sort("sortedList"));
		logger.debug("sortedList排序后："+client.lrange("sortedList", 0, -1));

		
		client.close();
	}

	/**
	 * 用户对某文章添加评论
	 */
	@Test
	public void testAddComment(){
		
		Jedis client = new Jedis("127.0.0.1",6379);
		client.auth("123456");
		
		//文章编号
		String articleId = "wz1001";
		//用户编号
		String userid = "u1003";
		//评论内容
		String content = "郑州房价太高了34";
		//评论时间
		String addtime = "2016-09-22 16:52:38";
		
		//TODO:此评论记录的唯一主键生成，用REDIS的计数器生成
		Long commentId = client.incr("comment:primary");
		
		//TODO:把此评论记录转换为一个Map对象中
		Map<String,String> commentMap = new HashMap<String,String>();
		commentMap.put("commentId", String.valueOf(commentId));
		commentMap.put("userid", userid);
		commentMap.put("articleId", articleId);
		commentMap.put("content", content);
		commentMap.put("addtime", addtime);
		//把此MAP存储到REDIS中
		client.hmset("comment:"+commentId, commentMap);
		
		
		//同时把评论记录编号，添加到文章的评论列表中(可以视为数据表的关联表)
		client.lpush("article:"+articleId+":comments", String.valueOf(commentId));
		
		//TODO:内存中一篇文章列表最多保留5000条记录
		client.ltrim("article:"+articleId+":comments", 0, 7);
		
		client.close();
	}
	
	@Test
	public void testGetComments(){
	
		Jedis client = new Jedis("127.0.0.1",6379);
		client.auth("123456");
		
		//文章编号
		String articleId = "wz1001";
		//每页数据
		int pageSize = 2;
		//当前页码
		int pageIndex = 4;
		
		logger.debug("文章"+articleId+"的评论记录总数："+client.llen("article:"+articleId+":comments"));

		//同时把评论记录编号，添加到文章的评论列表中(可以视为数据表的关联表)
		List<String> commentsIdList = client.lrange("article:"+articleId+":comments", (pageIndex-1)*pageSize, pageIndex*pageSize-1);
		for(String commentId:commentsIdList){
			Map<String,String> curCommentMap = client.hgetAll("comment:"+commentId);
			logger.debug("评论："+curCommentMap);
		}
		//TODO:如果点击更多，内存中无数据了，再去查询数据库
		client.close();
		
	}
	
	
	
}
